// Loesung_von_Aufgabe_3.7_10_Raumflotte

Gravi[] Planeten = new Gravi[5];                       // Array für Himmelskörper mit dem Namen Planet aus der Klasse Gravi
Raumschiffe[] Sternenkreuzer = new Raumschiffe[8];     // Array für Himmelskörper mit dem Namen Sternenkreuzer aus der Klasse Raumschiffe

void setup()
{
  size(600, 600);
  // Nun legen wir die ganz konkreten Werte für unsere Himmelkörper fest
  // Reihenfolge der Werte: Ortsvektor r, Geschwindigkeitsvektor v, Masse m, Durchmesser der Himmelskörper D, Farbe c
  Planeten[0] = new Gravi(new PVector(300, 300), new PVector (0, 0), 2000, 30, new PVector (255, 255, 0)); // Sonne
  Planeten[1] = new Gravi(new PVector(300, 240), new PVector (5, 0), 2, 10, new PVector (0, 0, 255)); // blauer Planet
  Planeten[2] = new Gravi(new PVector(300, 200), new PVector (4, 0), 2, 10, new PVector (0, 255, 0)); // grüner Planet
  Planeten[3] = new Gravi(new PVector(300, 150), new PVector  (3, 0), 3, 15, new PVector (255, 0, 0)); // roter Planet
  Planeten[4] = new Gravi(new PVector(300, 100), new PVector  (3, 0), 4, 15, new PVector (200, 200, 200)); // grauer Planet

  // Nun legen wir die ganz konkreten Werte für unsere Raumschiffe fest
  // Reihenfolge der Werte: Ortsvektor r, Geschwindigkeitsvektor v, Farbe c
  Sternenkreuzer[0] = new Raumschiffe(new PVector(10, 100), new PVector (5.0, 0), new PVector (0, 0, 0)); // schwarzer Sternenkreuzer
  Sternenkreuzer[1] = new Raumschiffe(new PVector(10, 150), new PVector (1.5, 0), new PVector (255, 0, 0)); // roter Sternenkreuzer
  Sternenkreuzer[2] = new Raumschiffe(new PVector(10, 200), new PVector (3.5, 0), new PVector (255, 255, 0)); // gelber Sternenkreuzer
  Sternenkreuzer[3] = new Raumschiffe(new PVector(10, 250), new PVector (4.0, 0), new PVector (0, 255, 0)); // grüner Sternenkreuzer
  Sternenkreuzer[4] = new Raumschiffe(new PVector(10, 350), new PVector (1.2, 0), new PVector (0, 0, 255)); // blauer Sternenkreuzer
  Sternenkreuzer[5] = new Raumschiffe(new PVector(10, 400), new PVector (6.0, 0), new PVector (255, 0, 255)); // violetter Sternenkreuzer
  Sternenkreuzer[6] = new Raumschiffe(new PVector(10, 450), new PVector (2.5, 0), new PVector (100, 100, 100)); // grauer Sternenkreuzer
  Sternenkreuzer[7] = new Raumschiffe(new PVector(10, 500), new PVector (2.0, 0), new PVector (255, 255, 255)); // weißer Sternenkreuzer
}

void draw()
{
  background(0);
  for (int i = 0; i < Planeten.length; i++)
  {
    for (int j = 0; j < Planeten.length; j++)
    {
      if (i == j)
        continue; /* Für i == j würde der Himmelskörper mit sich selber wechselwirken. Mit continue vermeiden wir dies. 
       Die Operation i == j wird einfach ausgelassen. In der Referenz steht: When run inside of a for or while, 
       it skips the remainder of the block and starts the next iteration */

      Planeten[i].force(Planeten[j], 1); // Die Gravitationskonstante G wurde hier gleich 1 gesetzt
    }
  }

  for (int i = 0; i < Planeten.length; i++)
  {
    Planeten[i].move(0.2); // Für kleine t-Werte (hier t = 0.1) erhält man eine stabile Simulation
    Planeten[i].display();

    for (int j = 0; j < Sternenkreuzer.length; j++)
    {
      Sternenkreuzer[j].move(0.1);
      Sternenkreuzer[j].display();
    }
  }
}